package tutorial.service;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import jp.fores.midori.server.annotation.RPCService;
import tutorial.dto.SampleInputDto;
import tutorial.dto.SampleOutputDto;

/**
 * RPCのテスト用のサービス。<br>
 */
@RPCService
public class TestService {
	//==========================================================
	//メソッド

	//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
	//通常のメソッド

	/**
	 * 引数・戻り値共になしのメソッドです。
	 *
	 * @throws Exception 例外
	 */
	public void inNoOutNo() throws Exception {
		System.out.println("inNoOutNoが呼び出されました");
	}

	/**
	 * 引数・戻り値共に文字列のメソッドです。
	 *
	 * @param str 文字列
	 * @return 文字列
	 * @throws Exception 例外
	 */
	public String inStrOutStr(String str) throws Exception {
		System.out.println("inStrOutStrが呼び出されました");
		System.out.println("引数:" + str);

		return "inStrOutStrの戻り値";
	}

	/**
	 * 引数が文字列、戻り値がなしのメソッドです。
	 *
	 * @param str 文字列
	 * @throws Exception 例外
	 */
	public void inStrOutNo(String str) throws Exception {
		System.out.println("inStrOutNoが呼び出されました");
		System.out.println("引数:" + str);
	}

	/**
	 * 引数がなし、戻り値が文字列のメソッドです。
	 *
	 * @return 文字列
	 * @throws Exception 例外
	 */
	public String inNoOutStr() throws Exception {
		System.out.println("inNoOutStrが呼び出されました");

		return "inNoOutStrの戻り値";
	}

	/**
	 * オーバーロードのテスト用のメソッドです。(引数なし)<br>
	 *
	 * @return 文字列
	 * @throws Exception 例外
	 */
	public String overloadTest() throws Exception {
		System.out.println("overloadTest(引数なし)が呼び出されました");

		return "overloadTest(引数なし)の戻り値";
	}

	/**
	 * オーバーロードのテスト用のメソッドです。(引数1つ)<br>
	 *
	 * @param str1 引数1
	 * @return 文字列
	 * @throws Exception 例外
	 */
	public String overloadTest(String str1) throws Exception {
		System.out.println("overloadTest(引数1つ)が呼び出されました");
		System.out.println("引数1:" + str1);

		return "overloadTest(引数1つ)の戻り値";
	}

	/**
	 * オーバーロードのテスト用のメソッドです。(引数2つ)<br>
	 *
	 * @param str1 引数1
	 * @param str2 引数2
	 * @return 文字列
	 * @throws Exception 例外
	 */
	public String overloadTest(String str1, String str2) throws Exception {
		System.out.println("overloadTest(引数2つ)が呼び出されました");
		System.out.println("引数1:" + str1);
		System.out.println("引数2:" + str2);

		return "overloadTest(引数2つ)の戻り値";
	}

	/**
	 * 引数・戻り値共にDTOのメソッドです。
	 *
	 * @param dto 入力データ用のサンプルDTO
	 * @return 出力データ用のサンプルDTO
	 * @throws Exception 例外
	 */
	public SampleOutputDto inDtoOutDto(SampleInputDto dto) throws Exception {
		System.out.println("inDtoOutDtoが呼び出されました");
		System.out.println(dto);

		//戻り値のDTOを作成
		SampleOutputDto resultDto = new SampleOutputDto();
		resultDto.intValue = 987;
		resultDto.strValue = "あいうえお";
		resultDto.byteArray = "テストです123".getBytes();


		//戻り値のDTOを返す
		return resultDto;
	}

	/**
	 * 引数・戻り値共にDTOの配列のメソッドです。
	 *
	 * @param dtoArray 入力データ用のサンプルDTOの配列
	 * @return 出力データ用のサンプルDTOの配列
	 * @throws Exception 例外
	 */
	public SampleOutputDto[] inDtoOutDtoArray(SampleInputDto[] dtoArray)
			throws Exception {
		System.out.println("inDtoOutDtoArrayが呼び出されました");
		for (SampleInputDto dto : dtoArray) {
			System.out.println(dto);
		}


		//結果のリストを作成
		List<SampleOutputDto> list = new ArrayList<SampleOutputDto>();

		{
			SampleOutputDto resultDto = new SampleOutputDto();
			resultDto.intValue = 1;
			resultDto.strValue = "一";
			resultDto.byteArray = "あ".getBytes();

			list.add(resultDto);
		}

		{
			SampleOutputDto resultDto = new SampleOutputDto();
			resultDto.intValue = 2;
			resultDto.strValue = "二";
			resultDto.byteArray = "い".getBytes();

			list.add(resultDto);
		}

		{
			SampleOutputDto resultDto = new SampleOutputDto();
			resultDto.intValue = 3;
			resultDto.strValue = "三";
			resultDto.byteArray = "う".getBytes();

			list.add(resultDto);
		}

		//リストを配列に変換して返す
		return list.toArray(new SampleOutputDto[0]);
	}

	/**
	 * 引数・戻り値共にDTOのListのメソッドです。
	 *
	 * @param dtoList 入力データ用のサンプルDTOのList
	 * @return 出力データ用のサンプルDTOのList
	 * @throws Exception 例外
	 */
	public List<SampleOutputDto> inDtoOutDtoList(List<SampleInputDto> dtoList)
			throws Exception {
		System.out.println("inDtoOutDtoListが呼び出されました");
		for (SampleInputDto dto : dtoList) {
			System.out.println(dto);
		}


		//結果のリストを作成
		List<SampleOutputDto> list = new ArrayList<SampleOutputDto>();

		{
			SampleOutputDto resultDto = new SampleOutputDto();
			resultDto.intValue = 1;
			resultDto.strValue = "一";
			resultDto.byteArray = "あ".getBytes();

			list.add(resultDto);
		}

		{
			SampleOutputDto resultDto = new SampleOutputDto();
			resultDto.intValue = 2;
			resultDto.strValue = "二";
			resultDto.byteArray = "い".getBytes();

			list.add(resultDto);
		}

		{
			SampleOutputDto resultDto = new SampleOutputDto();
			resultDto.intValue = 3;
			resultDto.strValue = "三";
			resultDto.byteArray = "う".getBytes();

			list.add(resultDto);
		}

		//リストを返す
		return list;
	}

	/**
	 * 引数・戻り値共にDTOのMapのメソッドです。
	 *
	 * @param dtoMap 入力データ用のサンプルDTOのMap
	 * @return 出力データ用のサンプルDTOのMap
	 * @throws Exception 例外
	 */
	public Map<String, SampleOutputDto> inDtoOutDtoMap(
			Map<String, SampleInputDto> dtoMap) throws Exception {
		System.out.println("inDtoOutDtoMapが呼び出されました");
		for (Entry<String, SampleInputDto> entry : dtoMap.entrySet()) {
			System.out.println("引数のキー:" + entry.getKey() + ", 値:"
					+ entry.getValue());
		}


		//結果のMapを作成
		Map<String, SampleOutputDto> map = new LinkedHashMap<String, SampleOutputDto>();

		{
			SampleOutputDto resultDto = new SampleOutputDto();
			resultDto.intValue = 1;
			resultDto.strValue = "一";
			resultDto.byteArray = "あ".getBytes();

			map.put("キー1", resultDto);
		}

		{
			SampleOutputDto resultDto = new SampleOutputDto();
			resultDto.intValue = 2;
			resultDto.strValue = "二";
			resultDto.byteArray = "い".getBytes();

			map.put("キー2", resultDto);
		}

		{
			SampleOutputDto resultDto = new SampleOutputDto();
			resultDto.intValue = 3;
			resultDto.strValue = "三";
			resultDto.byteArray = "う".getBytes();

			map.put("キー3", resultDto);
		}

		//Mapを返す
		return map;
	}
}
